package com.zenithmind.document.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.document.pojo.domain.Document;
import com.zenithmind.document.pojo.dto.DocumentCreateDTO;
import com.zenithmind.document.pojo.dto.DocumentUpdateDTO;
import com.zenithmind.document.pojo.dto.DocumentUploadDTO;
import com.zenithmind.document.pojo.query.DocumentQueryDTO;
import com.zenithmind.document.pojo.vo.DocumentDetailVO;
import com.zenithmind.document.pojo.vo.DocumentVO;

import java.util.List;

/**
 * 文档基础服务接口
 * 遵循接口隔离原则：只包含基础CRUD操作
 * 遵循单一职责原则：专注于文档基本管理功能
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface DocumentBasicService extends IService<Document> {

    /**
     * 上传文档
     * 
     * @param uploadDTO 上传信息
     * @return 文档信息
     */
    DocumentVO uploadDocument(DocumentUploadDTO uploadDTO);

    /**
     * 创建文档
     * 
     * @param createDTO 创建信息
     * @return 文档信息
     */
    DocumentVO createDocument(DocumentCreateDTO createDTO);

    /**
     * 更新文档
     * 
     * @param id 文档ID
     * @param updateDTO 更新信息
     * @return 是否成功
     */
    Boolean updateDocument(String id, DocumentUpdateDTO updateDTO);

    /**
     * 删除文档
     * 
     * @param id 文档ID
     * @return 是否成功
     */
    Boolean deleteDocument(String id);

    /**
     * 批量删除文档
     * 
     * @param ids 文档ID列表
     * @return 是否成功
     */
    Boolean batchDeleteDocuments(List<String> ids);

    /**
     * 恢复文档
     * 
     * @param id 文档ID
     * @return 是否成功
     */
    Boolean restoreDocument(String id);

    /**
     * 分页查询文档
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<DocumentVO> getDocumentPage(DocumentQueryDTO queryDTO);

    /**
     * 获取文档详情
     * 
     * @param id 文档ID
     * @param userId 用户ID
     * @return 文档详情
     */
    DocumentDetailVO getDocumentDetail(String id, String userId);

    /**
     * 根据ID获取文档
     * 
     * @param id 文档ID
     * @return 文档信息
     */
    DocumentVO getDocumentById(String id);

    /**
     * 检查文档是否存在
     * 
     * @param id 文档ID
     * @return 是否存在
     */
    Boolean existsDocument(String id);

    /**
     * 检查文档权限
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @param permission 权限类型
     * @return 是否有权限
     */
    Boolean checkDocumentPermission(String documentId, String userId, String permission);

    /**
     * 验证文档所有权
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @return 是否为所有者
     */
    Boolean validateDocumentOwnership(String documentId, String userId);
}
